﻿#include "datacenter.h"
#include <QDebug>
#include <QSqlError>
#include <QSqlQuery>
#include <QCryptographicHash>
#include <QDateTime>
#include <QSqlRecord>
#include <QApplication>
#include <QFile>
#include <QtXml>

DataCenter::DataCenter()
{
//    qDebug() << QSqlDatabase::drivers() << endl;
    db = QSqlDatabase::addDatabase("QMYSQL"); // 添加mysql对象

    // 当前可执行程序所在的路径
    QString path = QCoreApplication::applicationDirPath();
    QFile file(path + "/xml.xml");
    if (!file.open(QIODevice::ReadOnly))
    {
        qDebug() << "文件打开失败!" << file.errorString() << endl;
        return;
    }

    QByteArray content = file.readAll();
    file.close();

    QDomDocument doc; // xml文件对象
    QString errorString;
    int row, col;
    if (doc.setContent(content, &errorString, &row, &col) == false)
    {
        qDebug() << row << ", " << col << errorString << endl;
        return;
    }
    qDebug() << "xml打开成功!" << endl;

    QDomElement root = doc.documentElement(); // 根节点
    qDebug() << root.nodeName() << endl;

    auto sqlName = root.firstChildElement("数据库"); // 取子节点中名字是数据库的
    qDebug() << sqlName.attributeNode("host").value() << endl;; // 取数据库的属性节点
    qDebug() << sqlName.attributeNode("user").value() << endl;; // 取数据库的属性节点
    qDebug() << sqlName.attributeNode("passwd").value() << endl;; // 取数据库的属性节点
    qDebug() << sqlName.attributeNode("database").value() << endl;; // 取数据库的属性节点

    db.setHostName(sqlName.attributeNode("host").value());
    db.setUserName(sqlName.attributeNode("user").value());
    db.setPassword(sqlName.attributeNode("passwd").value());
    db.setDatabaseName(sqlName.attributeNode("database").value());
    db.setPort(3306);

    if (db.open())
    {
        qDebug() << "数据库打开成功" << endl;
    }
    else
    {
        qDebug() << db.lastError() << endl;
    }

    // 数据库语句执行类
    QSqlQuery query(db);
    if (!query.exec("create table if not exists user(account varchar(255) primary key, passwd text, name text, salt text, photo LONGBLOB);"))
    {
        qDebug() << db.lastError() << endl;
    }

}

QByteArray GenerateSalt()
{
    // 借用哈希函数用当前时间生成一个盐值->转为16进制
    return QCryptographicHash::hash(QDateTime::currentDateTime().toString().toStdString().c_str(), QCryptographicHash::Sha256).toHex();
}

// 哈希加盐
QByteArray HashWithSalt(const QString &passwd, const QByteArray &salt)
{
    QByteArray truePasswd = passwd.toStdString().c_str();
    truePasswd.append(salt);
    return QCryptographicHash::hash(truePasswd, QCryptographicHash::Sha256).toHex();
}

// 获取所有信息
void DataCenter::GetUserInfo()
{
    UserAccount.clear();
    UsersInfo.clear();

    // 执行查询列表语句
    QSqlQuery query(db);
    if (!query.exec("select *from user;"))
    {
        qDebug() << "列表查询:" << db.lastError() << endl;
    }

    // 按行读取数据
    while (query.next()) // 每次调用 next() 获取一行数据
    {
        strArr row; // 临时存储当前行的数据
        UserAccount.append(query.value(0).toString()); // 假设第一列是用户账号

        for (int i = 0; i < query.record().count(); ++i) // 遍历每一列
        {
            row.append(query.value(i).toString());
        }

        UsersInfo.append(row); // 将当前行数据添加到总列表中
    }
}

// 注册
int DataCenter::SignUp(const QString &account, const QString &passwd, const QString &name, const QByteArray &imgInfo)
{
    GetUserInfo();
//    qDebug() << UserAccount.size() << endl;
    for (int i = 0; i < UserAccount.size(); i++)
    {
        if (UserAccount[i] == account)
        {
            qDebug() << UserAccount[i] << endl;
            qDebug() << account << endl;
            qDebug() << "账号重复" << endl;
            return 0;
        }
    }

    auto salt = GenerateSalt();
    qDebug() << "生成:" << salt << endl;
    auto truePasswd = HashWithSalt(passwd, salt);

    QSqlQuery query(db);
    QString sql = "insert into user values(?, ?, ?, ?, ?)";
    query.prepare(sql); // 准备sql语句
    query.bindValue(0, account);
    query.bindValue(1, truePasswd);
    query.bindValue(2, name);
    query.bindValue(3, salt);
    query.bindValue(4, imgInfo);

    if (!query.exec())
    {
        qDebug() << db.lastError() << endl;
        return -1;
    }
    return 1;
}

// 登录
int DataCenter::Login(const QString &account, const QString &passwd)
{
    qDebug() << "登录判断" << endl;
    GetUserInfo();
    for (int i = 0; i < UsersInfo.size(); i++)
    {
        if (UsersInfo[i][0] == account)
        {
            QByteArray salt = UsersInfo[i][3].toStdString().c_str(); // 将盐转为字节数组
            qDebug() << "回退:" << salt << endl;
            if (HashWithSalt(passwd, salt) == UsersInfo[i][1])
            {
                qDebug() << "密码正确" << endl;
                return 1;
            }
            else
            {
                qDebug() << "密码错误" << endl;
                return 0;
            }
        }
    }
    qDebug() << "用户不存在" << endl;
    return -1;
}

// 查找头像
QByteArray DataCenter::FindPhoto(const QString &account)
{
    qDebug() << account << endl;
    QSqlQuery query(db);
    QString sql = "select photo from user where account = :account;";
    query.prepare(sql); // 准备sql语句
    query.bindValue(":account", account);

    if(!query.exec())
    {
        qDebug() << query.lastError() << endl;
        return {};
    }

    if (query.next())
    {
        qDebug() << "查询头像数据成功!" << endl;
        // 获取查询结果中的头像数据

        QByteArray photoData = query.value("photo").toByteArray();
        qDebug() << "头像数据" << photoData << endl;
        return photoData;
    }

    qDebug() << "查询头像数据失败!" << endl;
    // 查询失败或者没有找到对应的头像数据，返回空的 QByteArray
    return {};
}
